CH03-openCV基础函数
1. openCV 的绘图函数
1.1 画直线
cv2.line(img, start_point, end_point, color, thickness =0)
| 参数 | 说明 |
|---|---|
| img | 需要画的图像 |
| start_point | 直线的开头,必须是一个元组 |
| end_point | 直线的结尾,必须是一个元组 |
| color | 直线的颜色,必须是一个元组 |
| thickness | 直线的宽度 |
img = cv2.imread('./img/ch03-1.jpg')
img = cv2.line(img, (10,10), (100,100), (0,0,255), 2)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.2 画矩形
cv2.rectangle(img, point1, point2, color, thickness = 0)
| 参数 | 说明 |
|---|---|
| img | 需要画的图像 |
| point1 | 矩形左上角的点的坐标,必须是一个元组 |
| point2 | 矩形右下角的点的坐标,必须是一个元组 |
| color | 直线的颜色,必须是一个元组 |
| thickness | 直线的宽度 |
img = cv2.imread('./img/ch03-1.jpg')
img = cv2.rectangle(img,(10,10), (100,100), (255,0,0), 4)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
实例 01:
img = np.zeros((512,512,3),np.uint8) # 创建一个黑色的画布,大小为 512X512 像素,通道数为 3
flag = 1
while flag:
for i in range(0,256):
cv2.rectangle(img,(0,0), (150,128), (i, 255-i, i), 3)
cv2.rectangle(img, (350, 0), (500, 128), (i, 255 - i, i), 3)
cv2.rectangle(img, (0, 350), (150, 478), (i, 255 - i, i), 3)
cv2.rectangle(img, (350, 350), (500, 478), (i, 255 - i, i), 3)
cv2.rectangle(img, (165, 180), (315, 308), (i, 255 - i, i), 3)
cv2.namedWindow('image',cv2.WINDOW_NORMAL)
cv2.resizeWindow('image',(1000,1000))
cv2.imshow('image',img)
if cv2.waitKey(1) == ord('q'):
flag -= 1
break
cv2.destroyAllWindows()
1.3 画圆
cv2.cicle(img, center, R, color, thickness = 0)
| 参数 | 说明 |
|---|---|
| img | 需要画的图像 |
| center | 圆心坐标,必须是一个元组 |
| R | 圆的半径 |
| color | 直线的颜色,必须是一个元组 |
| thickness | 直线的宽度,如果是-1,会变成向内填充 |
img = cv2.imread('./img/ch03-1.jpg')
img = cv2.circle(img, (200,200), 100, (0,0,255),-1)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.4 画椭圆
cv2.ellipse(img, center, (a,b), direction, angle_start, angle_end, color, thickness = 0)
| 参数 | 说明 |
|---|---|
| img | 需要画的图像 |
| center | 椭圆圆心坐标,必须是一个元组 |
| (a,b) | 椭圆的长轴和短轴 |
| direction | 按照顺时针方向旋转椭圆的角度 |
| angle_start | 画椭圆开始的角度 |
| angle_stop | 画椭圆结束的角度 |
| color | 直线的颜色,必须是一个元组 |
| thickness | 直线的宽度,如果是-1,会变成向内填充 |
img = cv2.imread('./img/ch03-1.jpg')
img = cv2.ellipse(img,(150,150),(100,80),25,30,210,(0,255,0),-1)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.5 画多边形
cv2.polylines(img, pts, isClosed, color, thickness = 0)
| 参数 | 说明 |
|---|---|
| img | 需要画的图像 |
| pts | 点的集合,以列表形式填入 |
| isClosed | 多边形是否闭合,False:不闭合,True:闭合 |
| color | 直线的颜色,必须是一个元组 |
| thickness | 直线的宽度,如果是-1,会变成向内填充 |
img = np.zeros((256,256,3), np.uint8) # 创建一个大小为 256X256像素,三通道的黑色画布
pts = np.array([[10,3],[48,19],[60,3],[98,19]],np.int32) # 注意,格式必须是 np.int32
pts = pts.reshape((-1,1,2))
cv2.polylines(img, [pts], True, (0,255,255), 2)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.6 添加文字
cv2.putText(img, text, org, fontFace, fontScale, color, thickness = 0, lineType = 0)
| 参数 | 说明 |
|---|---|
| img | 需要添加文字的背景图 |
| text | 添加的文字 |
| org | 添加文字的位置 |
| fontFace | 字体 |
| fontScale | 字体大小 |
| color | 字的颜色 |
| thickness | 线条的宽度 |
| lineType | 线条的种类 |
img = np.zeros((512,512,3),np.uint8)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, 'python-openCV', (10,40), font, 1, (255,255,100),2,cv2.LINE_AA)
cv2.namedWindow('image',cv2.WINDOW_NORMAL)
cv2.resizeWindow('image',750,750)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 处理鼠标事件函数
cv2.setMouseCallback(img, onMouse)
| 参数 | 说明 |
|---|---|
| img | 要绑定画面的名字 |
| onMouse | 响应函数,即当鼠标事件触发时调用的函数 |
cv2.setMouseCallback('image',draw_circle)
2.1 鼠标事件
| 参数 | 说明 |
|---|---|
| EVENT_FLAG_ALTKEY | 按 alt 键不放 |
| EVENT_FLAG_CTRLKEY | 按 ctrl 键不放 |
| EVENT_FLAG_LBUTTON | 左键拖拽 |
| EVENT_FLAG_MBUTTON | 中键拖拽 |
| EVENT_FLAG_RBUTTON | 右键拖拽 |
| EVENT_FLAG_SHIFTKEY | 按 shift 键不放 |
| EVENT_LBUTTONDBLCLK | 左键双击 |
| EVENT_LBUTTONDOWN | 左键单击 |
| EVENT_LBUTTONUP | 左键释放 |
| EVENT_MBUTTONDBLCLK | 中键双击 |
| EVENT_MBUTTONDOWN | 中键单击 |
| EVENT_MBUTTONUP | 中键释放 |
| EVENT_MOUSEMOVE | 滑动 |
| EVENT_RBUTTONDBLCLK | 右键双击 |
| EVENT_RBUTTONDOWN | 右键单击 |
| EVENT_RBUTTONUP | 右键释放 |
def draw_circle(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDBLCLK:
cv2.circle(img, (x,y), 100, (255,0,0), -1)
img = np.zeros((500,500,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)
while True:
cv2.imshow('image',img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
3. 滑动条式调色板实例
cv2.creatTrackbar(Track_name, img, min, max, TrackBarCallback)
| 参数 | 说明 |
|---|---|
| Track_name | 滑动条的名字 |
| img | 滑动条所在的画布 |
| min | 滑动条的最小值 |
| max | 滑动条的最大值 |
| TrackBarCallback | 滑动条的回调函数 |
cv2.getTrackbarPos(Track_name, img)
| 参数 | 说明 |
|---|---|
| Track_name | 滑动条的名字 |
| img | 滑动条所在的画布 |
返回值是滑动条当前所在的位置
img = np.zeros((300, 512, 3), np.uint8)
cv2.namedWindow('image')
cv2.createTrackbar('R', 'image', 0, 255)
cv2.createTrackbar('G', 'image', 0, 255)
cv2.createTrackbar('B', 'image', 0, 255)
switch = '0:OFF \n 1:ON'
cv2.createTrackbar(switch, 'image', 0, 1)
while 1:
cv2.imshow('image', img)
k = cv2.waitKey(1)
if k == ord('q'):
break
r = cv2.getTrackbarPos('R', 'image')
g = cv2.getTrackbarPos('G', 'image')
b = cv2.getTrackbarPos('B', 'image')
s = cv2.getTrackbarPos(switch, 'image')
if s == 0:
img[:] = 0
else:
img[:] = [r, g, b]
cv2.destroyAllWindows()